<!--
  Copyright 2013 IBM Corp.

  Licensed under the Apache License, Version 2.0 (the "License");
  you may not use this file except in compliance with the License.
  You may obtain a copy of the License at

  http://www.apache.org/licenses/LICENSE-2.0

  Unless required by applicable law or agreed to in writing, software
  distributed under the License is distributed on an "AS IS" BASIS,
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  See the License for the specific language governing permissions and
  limitations under the License.
-->

<!--  The Input Node  -->
<script type="text/x-red" data-template-name="udp in">
    <div class="form-row">
        <label for="node-input-port"><i class="fa fa-sign-in"></i> <span data-i18n="udp.label.listen"></span></label>
        <select id="node-input-multicast" style='width:62%'>
          <option value="false" data-i18n="udp.udpmsgs"></option>
          <option value="true" data-i18n="udp.mcmsgs"></option>
        </select>
    </div>
    <div class="form-row node-input-group">
        <label for="node-input-group"><i class="fa fa-list"></i> <span data-i18n="udp.label.group"></span></label>
        <input type="text" id="node-input-group" placeholder="225.0.18.83">
    </div>
    <div class="form-row node-input-iface">
        <label for="node-input-iface"><i class="fa fa-random"></i> <span data-i18n="udp.label.interface"></span></label>
        <input type="text" id="node-input-iface" data-i18n="[placeholder]udp.label.interface">
    </div>
    <div class="form-row">
        <label for="node-input-port"><i class="fa fa-sign-in"></i> <span data-i18n="udp.label.onport"></span></label>
        <input type="text" id="node-input-port" style="width: 80px">
        &nbsp;&nbsp;<span data-i18n="udp.label.using"></span> <select id="node-input-ipv" style="width:80px">
          <option value="udp4">ipv4</option>
          <option value="udp6">ipv6</option>
        </select>
    </div>
    <div class="form-row">
        <label for="node-input-datatype"><i class="fa fa-sign-out"></i> <span data-i18n="udp.label.output"></span></label>
        <select id="node-input-datatype" style="width: 70%;">
            <option value="buffer" data-i18n="udp.output.buffer"></option>
            <option value="utf8" data-i18n="udp.output.string"></option>
            <option value="base64" data-i18n="udp.output.base64"></option>
        </select>
    </div>
    <div class="form-row">
        <label for="node-input-name"><i class="fa fa-tag"></i> <span data-i18n="common.label.name"></span></label>
        <input type="text" id="node-input-name" data-i18n="[placeholder]common.label.name">
    </div>
    <div class="form-tips"><span data-i18n="udp.tip.in"></span></div>
</script>

<script type="text/x-red" data-help-name="udp in">
    <p>A udp input node, that produces a <b>msg.payload</b> containing a <i>BUFFER</i>, string, or base64 encoded string. Supports multicast.</p>
    <p>It also provides <b>msg.ip</b> and <b>msg.port</b> to the ip address and port from which the message was received.</p>
    <p>On some systems you may need to be root to use ports below 1024 and/or broadcast.</p>
</script>

<script type="text/javascript">
    RED.nodes.registerType('udp in',{
        category: 'input',
        color:"Silver",
        defaults: {
            name: {value:""},
            iface: {value:""},
            port: {value:"",required:true,validate:RED.validators.number()},
            ipv: {value:"udp4"},
            multicast: {value:"false"},
            group: {value:"",validate:function(v) { return (this.multicast !== "true")||v.length > 0;} },
            datatype: {value:"buffer",required:true}
        },
        inputs:0,
        outputs:1,
        icon: "bridge-dash.png",
        label: function() {
            if (this.multicast=="false") {
                return this.name||"udp "+this.port;
            }
            else return this.name||"udp "+(this.group+":"+this.port);
        },
        labelStyle: function() {
            return this.name?"node_label_italic":"";
        },
        oneditprepare: function() {
            $("#node-input-multicast").change(function() {
                var id = $("#node-input-multicast option:selected").val();
                if (id == "false") {
                    $(".node-input-group").hide();
                    $(".node-input-iface").hide();
                }
                else {
                    $(".node-input-group").show();
                    $(".node-input-iface").show();
                }
            });
            $("#node-input-multicast").change();
        }
    });
</script>


<!--  The Output Node  -->
<script type="text/x-red" data-template-name="udp out">
    <div class="form-row">
        <label for="node-input-port"><i class="fa fa-envelope"></i> <span data-i18n="udp.label.send"></span></label>
        <select id="node-input-multicast" style="width:40%">
          <option value="false" data-i18n="udp.udpmsg"></option>
          <option value="broad" data-i18n="udp.bcmsg"></option>
          <option value="multi" data-i18n="udp.mcmsg"></option>
        </select>
        <span data-i18n="udp.label.toport"></span> <input type="text" id="node-input-port" style="width: 70px">
    </div>
    <div class="form-row node-input-addr">
        <label for="node-input-addr" id="node-input-addr-label"><i class="fa fa-list"></i> <span data-i18n="udp.label.address"></span></label>
        <input type="text" id="node-input-addr" data-i18n="[placeholder]udp.placeholder.address" style="width: 50%;">
        <select id="node-input-ipv" style="width:70px">
          <option value="udp4">ipv4</option>
          <option value="udp6">ipv6</option>
        </select>
    </div>
    <div class="form-row node-input-iface">
        <label for="node-input-iface"><i class="fa fa-random"></i> <span data-i18n="udp.label.interface"></span></label>
        <input type="text" id="node-input-iface" data-i18n="[placeholder]udp.placeholder.interface">
    </div>
    <div class="form-row">
        <label for="node-input-outport-type">&nbsp;</label>
        <select id="node-input-outport-type">
          <option id="node-input-outport-type-random" value="random" data-i18n="udp.bind.random"></option>
          <option value="fixed" data-i18n="udp.bind.local"></option>
        </select>
        <input type="text" id="node-input-outport"  style="width: 70px;">
    </div>
    <div class="form-row">
        <label>&nbsp;</label>
        <input type="checkbox" id="node-input-base64" style="display: inline-block; width: auto; vertical-align: top;">
        <label for="node-input-base64" style="width: 70%;"><span data-i18n="udp.label.decode-base64"></span></label>
    </div>
    <div class="form-row">
        <label for="node-input-name"><i class="fa fa-tag"></i> <span data-i18n="common.label.name"></span></label>
        <input type="text" id="node-input-name" data-i18n="[placeholder]common.label.name">
    </div>
    <div class="form-tips"><span data-i18n="[html]udp.tip.out"></span></div>
</script>

<script type="text/x-red" data-help-name="udp out">
    <p>This node sends <b>msg.payload</b> to the designated udp host and port. Supports multicast.</p>
    <p>You may also use <b>msg.ip</b> and <b>msg.port</b> to set the destination values.<br/><b>Note</b>: the statically configured values have precedence.</p>
    <p>If you select broadcast either set the address to the local broadcast ip address, or maybe try 255.255.255.255, which is the global broadcast address.</p>
    <p>On some systems you may need to be root to use ports below 1024 and/or broadcast.</p>
</script>

<script type="text/javascript">
    RED.nodes.registerType('udp out',{
        category: 'output',
        color:"Silver",
        defaults: {
            name: {value:""},
            addr: {value:""},
            iface: {value:""},
            port: {value:""},
            ipv: {value:"udp4"},
            outport: {value:""},
            base64: {value:false,required:true},
            multicast: {value:"false"}
        },
        inputs:1,
        outputs:0,
        icon: "bridge-dash.png",
        align: "right",
        label: function() {
            return this.name||"udp "+(this.addr+":"+this.port);
        },
        labelStyle: function() {
            return this.name?"node_label_italic":"";
        },
        oneditprepare: function() {
            var addresslabel = this._("udp.label.address");
            var addressph = this._("udp.placeholder.address");
            var grouplabel = this._("udp.label.group");
            var bindrandom = this._("udp.bind.random");
            var bindtarget = this._("udp.bind.target");

            var type = this.outport==""?"random":"fixed";
            $("#node-input-outport-type option").filter(function() {
                return $(this).val() == type;
            }).attr('selected',true);

            $("#node-input-outport-type").change(function() {
                var type = $(this).children("option:selected").val();
                if (type == "random") {
                    $("#node-input-outport").val("").hide();
                } else {
                    $("#node-input-outport").show();
                }
            });
            $("#node-input-outport-type").change();

            $("#node-input-multicast").change(function() {
                var id = $("#node-input-multicast option:selected").val();
                if (id === "multi") {
                    $(".node-input-iface").show();
                    $("#node-input-addr-label").html('<i class="fa fa-list"></i> ' + grouplabel);
                    $("#node-input-addr")[0].placeholder = '225.0.18.83';
                }
                else if (id === "broad") {
                    $(".node-input-iface").hide();
                    $("#node-input-addr-label").html('<i class="fa fa-list"></i> ' + addresslabel);
                    $("#node-input-addr")[0].placeholder = '255.255.255.255';
                }
                else {
                    $(".node-input-iface").hide();
                    $("#node-input-addr-label").html('<i class="fa fa-list"></i> ' + addresslabel);
                    $("#node-input-addr")[0].placeholder = addressph;
                }
                var type = $(this).children("option:selected").val();
                if (type == "false") {
                    $("#node-input-outport-type-random").html(bindrandom);
                } else {
                    $("#node-input-outport-type-random").html(bindtarget);
                }
            });
            $("#node-input-multicast").change();
        }
    });
</script>
